Fix a memory leak in an error path. Found by libFuzzer combined with some experimental unsafe-fuzzer-mode patches (to be uploaded once I've cleaned them up a bit) to disable all those pesky cryptographic checks in the protocol. Change-Id: I9153164fa56a0c2262c4740a3236c2b49a596b1b Reviewed-on: https://boringssl-review.googlesource.com/7282 Reviewed-by: Adam Langley <agl@google.com>
diff --git a/ssl/s3_clnt.c b/ssl/s3_clnt.c index 09e527a..bbbaccd 100644 --- a/ssl/s3_clnt.c +++ b/ssl/s3_clnt.c
@@ -1764,6 +1764,7 @@ return ssl_do_write(ssl); err: + CBB_cleanup(&cbb); if (pms != NULL) { OPENSSL_cleanse(pms, pms_len); OPENSSL_free(pms); diff --git a/ssl/test/runner/common.go b/ssl/test/runner/common.go index f2ef360..e7e4213 100644 --- a/ssl/test/runner/common.go +++ b/ssl/test/runner/common.go
@@ -424,6 +424,10 @@ // to be wrong. InvalidSKXCurve bool + // InvalidECDHPoint, if true, causes the ECC points in + // ServerKeyExchange or ClientKeyExchange messages to be invalid. + InvalidECDHPoint bool + // BadECDSAR controls ways in which the 'r' value of an ECDSA signature // can be invalid. BadECDSAR BadValue
diff --git a/ssl/test/runner/key_agreement.go b/ssl/test/runner/key_agreement.go index 9ecd2e5..54aa3d3 100644 --- a/ssl/test/runner/key_agreement.go +++ b/ssl/test/runner/key_agreement.go
@@ -566,6 +566,9 @@ } serverECDHParams[3] = byte(len(publicKey)) copy(serverECDHParams[4:], publicKey) + if config.Bugs.InvalidECDHPoint { + serverECDHParams[4] ^= 0xff + } return ka.auth.signParameters(config, cert, clientHello, hello, serverECDHParams) } @@ -622,6 +625,9 @@ ckx.ciphertext = make([]byte, 1+len(publicKey)) ckx.ciphertext[0] = byte(len(publicKey)) copy(ckx.ciphertext[1:], publicKey) + if config.Bugs.InvalidECDHPoint { + ckx.ciphertext[1] ^= 0xff + } return preMasterSecret, ckx, nil } diff --git a/ssl/test/runner/runner.go b/ssl/test/runner/runner.go index 57f1089..68bfd56 100644 --- a/ssl/test/runner/runner.go +++ b/ssl/test/runner/runner.go
@@ -2106,6 +2106,31 @@ resumeConfig: &Config{}, resumeSession: true, }, + { + name: "InvalidECDHPoint-Client", + config: Config{ + CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256}, + CurvePreferences: []CurveID{CurveP256}, + Bugs: ProtocolBugs{ + InvalidECDHPoint: true, + }, + }, + shouldFail: true, + expectedError: ":INVALID_ENCODING:", + }, + { + testType: serverTest, + name: "InvalidECDHPoint-Server", + config: Config{ + CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256}, + CurvePreferences: []CurveID{CurveP256}, + Bugs: ProtocolBugs{ + InvalidECDHPoint: true, + }, + }, + shouldFail: true, + expectedError: ":INVALID_ENCODING:", + }, } testCases = append(testCases, basicTests...) }